Initial Stuff

Load in Initial Processing file (and dependencies)

source(here::here("RScripts", "InitialProcessing_3.R"))
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.7
✓ tidyr   1.1.4     ✓ stringr 1.4.0
✓ readr   2.0.0     ✓ forcats 0.5.1
── Conflicts ─────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
here() starts at /home/jacob/Projects/ChesapeaakeMainstemAnalysis
New names:
* `` -> ...1
Rows: 86413 Columns: 111
── Column specification ─────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr   (1): ...1
dbl (110): 3-1-B-0-2_R1_filt.fastq.gz, 3-1-B-1-2_R1_filt.fastq.gz, 3-1-B-180_R1_filt.fastq.gz, 3-1-B-20_R...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
New names:
* `` -> ...1
Rows: 86413 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (7): ...1, Kingdom, Phylum, Class, Order, Family, Genus

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 220 Columns: 17
── Column specification ─────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (14): Run, Files, ID, Sample, Depth, Type, Paths, RenFiles, RenPaths, TrimmedFiles, TrimmedPaths, Fil...
dbl  (3): ReadDir, Station, Size

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 91 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Depth
dbl (6): Station, Size_Class, Bin_Size, DNAperLiter, MassperLiter, ParticlesPerLiter

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 110 Columns: 5
── Column specification ─────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): ID, Depth, Flag
dbl (2): Station, Size_Class

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
extract_numeric() is deprecated: please use readr::parse_number() instead
Joining, by = "TagLevel"
`summarise()` has grouped output by 'nASV'. You can override using the `.groups` argument.
Rows: 9 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Station
dbl (6): lat, long, UTMX, UTMY, depth, do

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
source(here::here("RLibraries", "ChesapeakePersonalLibrary.R"))

Cells/mg of particle

# my_sizes <- sort(unique(microbialAbundance$Size_Class))
# my_sizes
# scientific_10_c <- function(x) {
#     xout <- gsub("1e", "10^{", format(x),fixed=TRUE)
#     xout <- gsub("{-0", "{-", xout,fixed=TRUE)
#     xout <- gsub("{+", "{", xout,fixed=TRUE)
#     xout <- gsub("{0", "{", xout,fixed=TRUE)
#     xout <- paste(xout,"}",sep="")
#     return(parse(text=xout))
#     
# }
# 
# scale_y_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
#     breaks10 <- 10^omag
#     scale_y_log10(breaks=breaks10,labels=scientific_10_c(breaks10),...)
# } # Reclocated to ChesapeakePersonalLibrary.R
abunPlot <- microbialAbundance %>% 
  filter(is.finite(MassperLiter)) %>%
  filter(Depth %in% c("Surface", "Bottom")) %>%
  mutate(copiesPerMg = copiesPerL / MassperLiter) %>%
  ggplot(aes(x = Size_Class, y = copiesPerMg, shape = as.factor(Station), fill = as.factor(Station))) +
  facet_wrap(~Depth, ncol = 1) +
ches_plot_options()
Error in ches_plot_options() : 
  could not find function "ches_plot_options"
PPLPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  filter(Depth %in% c("Surface", "Bottom")) %>%
  ggplot(aes(x = Size_Class, y = ParticlesPerLiter, shape = as.factor(Station), fill = as.factor(Station))) +
  facet_wrap(~Depth, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Station))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag=seq(-10,20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  labs(y = "Particles/L/mm", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
PPLPlot

ParticleMassPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  filter(Depth %in% c("Surface", "Bottom")) %>%
  ggplot(aes(x = Size_Class, y = MassperLiter/ParticlesPerLiter, shape = as.factor(Station), fill = as.factor(Station))) +
  facet_wrap(~Depth, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Station))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  labs(y = "Dry Mass (mg) / Particle", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = .5))
ParticleMassPlot

Ibid but combined with data about particles and the CB map

I need to load over data from the CB-Bay project

source(here("RScripts", "CBMap.R"))
Rows: 9 Columns: 7
── Column specification ────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Station
dbl (6): lat, long, UTMX, UTMY, depth, do

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
library(cowplot)
library(grid)
library(gridExtra)

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
x.grob <- textGrob(expression(paste("Particle Size (", mu, "m)")), 
                   gp=gpar(fontsize=16))
combinedPlot <- plot_grid(PPLPlot, ParticleMassPlot, abunPlot, nrow = 1, labels = c("B", "C", "D"))
meta2 <- grid.arrange(arrangeGrob(combinedPlot, bottom = x.grob))

cbMap

physical_particles <- plot_grid(cbMap, meta2, rel_widths = c(1,3), labels = c("A", ""))
physical_particles

ggsave("PhysicalParticles.png", physical_particles, height = 4, width = 8)

Examplar species plot

What are the most abundant ASVs from each cluster? Plot their abundance. Pick the prettiest few and plot

source(here::here("RScripts", "ClusteringCore.R"))
hgroups_exemplars <- cutree(sclust, k = 10)
nonSpikes20C <- nonSpikes20 %>% left_join(
  tibble(ASV = names(hgroups_exemplars), cluster = hgroups_exemplars), by = "ASV")
ASVsToView <- nonSpikes20C %>%
  filter(Kingdom == "Bacteria") %>%
  group_by(ASV, cluster) %>%
  summarise(meanCopies = mean(copiesPerL)) %>%
  group_by(cluster) %>%
  summarize(topASV = ASV[which.max(meanCopies)])
`summarise()` has grouped output by 'ASV'. You can override using the `.groups` argument.
  
ASVsToView
nonSpikes20C %>% 
  right_join(ASVsToView, by = c("ASV" = "topASV", "cluster")) %>%
  group_by(ASV) %>%
  slice_head()
nonSpikes20C %>%
  right_join(ASVsToView, by = c("ASV" = "topASV", "cluster" = "cluster")) %>%
  filter(cluster <= 7, Depth %in% c("Surface", "Bottom"), !is.na(Depth)) %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma")

Fig X. Copies per L

nonSpikes20C %>%
  right_join(ASVsToView, by = c("ASV" = "topASV", "cluster" = "cluster")) %>%
  filter(cluster <= 7, Depth %in% c("Surface", "Bottom"), !is.na(Depth)) %>%
  filter(!is.na(MassperLiter)) %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/MassperLiter, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma")

Fig X + 1. Copies per mg stuff. I don’t love these examples because there is a bunch of station to station ariance, and you never see things that like, always show up at large stations.

I wonder if I can find some good examples of consistantly large particle stuff or something.

What if

I look for things that have high positive slope coefficients between size and normalized copies per L. And select for high mean abundance and high slope. And use site as a random effect? Would be nice to have some things that are intermediately high though. Some sort of polynomial regression?

nest20 <- nonSpikes20 %>%
  select(ASV, Station:ParticlesPerLiter, copiesPerL) %>%
  mutate(Station = as.factor(Station)) %>%
  group_by(ASV) %>%
  nest()
TestSub <- nest20[[2]][[1]] %>% ungroup()
TestSub
library(lme4)
Loading required package: Matrix

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack
library(broom)
library(broom.mixed)
lm(log(copiesPerL/Bin_Size) ~ log(Size_Class), data = TestSub) %>% tidy()
lmer(log(copiesPerL/Bin_Size) ~ log(Size_Class) + (Size_Class|Station) + (Size_Class|Depth) , data = TestSub %>% 
       mutate(as.factor(Station))) %>% AIC()
boundary (singular) fit: see ?isSingular
[1] 324.9089
lmer(log(copiesPerL/Bin_Size) ~ log(Size_Class) + (1|Station) + (1|Depth) , data = TestSub %>% 
       mutate(as.factor(Station))) %>% AIC() # Better
[1] 312.1515
modDf <- nest20 %>%
  mutate(mod = map(data, 
                   ~lmer(log((copiesPerL+1)/Bin_Size) ~ log(Size_Class) +
                           (Size_Class|Station) + (Size_Class|Depth), data = .)
  )
  )
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Model failed to converge with max|grad| = 0.127389 (tol = 0.002, component 1)Warning: Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Model failed to converge with max|grad| = 3.49011 (tol = 0.002, component 1)Warning: Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 2 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
modDf01 <- modDf %>% 
  mutate(tidied = map(mod, tidy)) %>%
  unnest(tidied) %>%
  select(-data, -mod)
modDf02 <- modDf01 %>%
  filter(term == "log(Size_Class)") %>%
  select(ASV, estimate, std.error)
modDf02 %>%
  ggplot(aes(x = estimate)) + geom_histogram() +
  scale_x_continuous(breaks = seq(from = -4, to = 2, by = 1))

There are some things that are ore abundant in the large particles

So Many ASVs. How do I ID the ones I want?

I kind of want to look at average concentrations (or sums)

SlopesAndMeans <- nonSpikes20 %>%
  #filter(Kingdom == "Bacteria") %>%
  group_by(ASV) %>%
  summarise(meanCopies = mean(copiesPerL)) %>%
  left_join(modDf02, by = "ASV")
SlopesAndMeans %>% head()
SlopesAndMeans %>%
  filter(estimate >= 0) %>%
  ggplot(aes(x = estimate, y = meanCopies, label = ASV)) +
  geom_point() +
  geom_label_repel()

ASV 13 looks promising

taxa %>% 
  filter(ASV %in% c("ASV_13", "ASV_23", "ASV_58"))

The big stuff are all cyanos! Huh.

Targets <- SlopesAndMeans %>% filter(estimate > 0, meanCopies > 1e5) %>% pull(ASV)
taxa %>%
  filter(ASV %in% Targets)
Horses <- SlopesAndMeans %>% 
  left_join(taxa, by = "ASV") %>%
  filter(estimate > 0, meanCopies > 0e5) %>%
  arrange(-meanCopies)
Horses

Ok. Big stuff are cyanos and Planctomycetes, and apparently Spiders. Also apparently some proteos of different stripes. Rhodobacter are cool though.

nonSpikes20 %>%
  left_join(SlopesAndMeans, by = "ASV") %>%
  filter(estimate > 0, meanCopies > 1e5, Depth != "Oxy") %>%
  arrange(-meanCopies, Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))

nonSpikes20 %>%
  left_join(SlopesAndMeans, by = "ASV") %>%
  filter(estimate > 0, meanCopies > 1e5, Depth != "Oxy") %>%
  arrange(-meanCopies, Size_Class) %>%
  filter(ASV == "ASV_7") %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  #facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))

nonSpikes20 %>%
  left_join(SlopesAndMeans, by = "ASV") %>%
  filter(estimate > 0, meanCopies < 1e5, Depth != "Oxy") %>%
  arrange(-meanCopies, Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))

Lets look at these!

I like, as examples Paracoccus (a Rhodobacter) -ASV_459 Synechococcus_CC9902 – ASV_23 SAR11_Clade – ASV_3

nonSpikes20 %>%
  filter(ASV %in% c("ASV_3", "ASV_23", "ASV_459"), Depth != "Oxy") %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 3) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station")

Module abundance plot

hgroups_ants <- cutree(sclust, k = 50)
nonSpikes20A <- nonSpikes20 %>% left_join(
  tibble(ASV = names(hgroups_ants), cluster = hgroups_ants), by = "ASV")
# ASVsToView <- nonSpikes20A %>%
#   filter(Kingdom == "Bacteria") %>%
#   group_by(ASV, cluster) %>%
#   summarise(meanCopies = mean(copiesPerL)) %>%
#   group_by(cluster) %>%
#   summarize(topASV = ASV[which.max(meanCopies)])
  
ClusterSumsA <- nonSpikes20A %>%
  group_by(Station, Depth, cluster, Size_Class, Bin_Size) %>%
  summarise(copiesPerL = sum(copiesPerL))
`summarise()` has grouped output by 'Station', 'Depth', 'cluster', 'Size_Class'. You can override using the `.groups` argument.
HugeSurfacePlot <- nonSpikes20A %>%
  filter(Depth == "Surface") %>%
  arrange(Bin_Size) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class)) +
  facet_grid(cluster ~ Station) +
  scale_y_log10nice(omag = seq(-10, 20, by = 4)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  geom_path(alpha = 0.5, aes(group = ASV)) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station") +
  geom_path(color = "red", data = ClusterSumsA %>% filter(Depth == "Surface")) # Add sums
ggsave("HugeSurfacePlot.pdf", HugeSurfacePlot, height = 72, width = 8, limitsize = FALSE)

I think we’re using “intercept” in the clustering information somehow. Which I don’t particularly want. But the clustering does happen by correlation. Super strange. Maybe the correlation isn’t the way I think it is?

MinimalSurfacePlot <- nonSpikes20A %>%
  filter(Depth == "Surface", cluster %in% c(1, 7, 15)) %>%
  arrange(Bin_Size) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class)) +
  facet_grid(cluster~ Station) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  geom_path(alpha = 0.5, aes(group = ASV)) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station") +
  geom_path(color = "red", data = ClusterSumsA %>% filter(Depth == "Surface", cluster %in% c(1, 7, 15))) # Add sums
ggsave("MinimalSurfacePlot.pdf", MinimalSurfacePlot, height = 11, width = 8, limitsize = FALSE)
MinimalSurfacePlot

MinimalClusterPlot <- nonSpikes20A %>%
  filter(Depth != "Oxy", cluster %in% c(1, 7, 15)) %>%
  arrange(Bin_Size) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class)) +
  facet_grid(cluster + Depth ~ Station) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  geom_path(alpha = 0.5, aes(group = ASV)) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station") +
  geom_path(color = "red", data = ClusterSumsA %>% filter(Depth != "Oxy", cluster %in% c(1, 7, 15))) # Add sums
ggsave("MinimalClusterPlot.pdf", MinimalClusterPlot, height = 11, width = 8, limitsize = FALSE)

For sairah specifically

ExampleTaxa <- nonSpikes20 %>%
  filter(ASV %in% c("ASV_3", "ASV_23", "ASV_459")) %>%
  filter(Station %in% c("3.3", "4.3")) %>%
  mutate(Depth = recode(Depth, Oxy = "Oxycline")) %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Depth), shape = as.factor(Depth))) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Station ~ Tag) +
  geom_point(size = 4) +
  geom_path(aes(color = as.factor(Depth))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "right") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station")
ExampleTaxa

Thing 2

abunPlot0 <- microbialAbundance %>% 
  filter(is.finite(MassperLiter)) %>%
  #filter(Depth %in% c("Surface", "Bottom")) %>%
  filter(Station %in% c(3.3, 4.3)) %>%
  mutate(Depth = recode(Depth, Oxy = "Oxycline")) %>%
  mutate(copiesPerMg = copiesPerL / MassperLiter) %>%
  ggplot(aes(x = Size_Class, y = copiesPerMg, shape = as.factor(Depth), fill = as.factor(Depth))) +
  facet_wrap(~Station, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Depth))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice() +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  labs(y = "16s + 18s Genes / mg Particles", x = expression(paste("Particle Size (", mu, "m)")), color = "Depth", fill = "Depth", shape = "Depth") +
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
SairahLegend <- get_legend(abunPlot0)
abunPlot <- abunPlot0 + theme(legend.position = "none")
#abunPlot
PPLPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  #filter(Depth %in% c("Surface", "Bottom")) %>%
  filter(Station %in% c(3.3, 4.3)) %>%
  ggplot(aes(x = Size_Class, y = ParticlesPerLiter, shape = as.factor(Depth), fill = as.factor(Depth))) +
  facet_wrap(~Station, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Depth))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag=seq(-10,20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  labs(y = "Particles/L/mm", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
#PPLPlot
ParticleMassPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  #filter(Depth %in% c("Surface", "Bottom")) %>%
  filter(Station %in% c(3.3, 4.3)) %>%
  ggplot(aes(x = Size_Class, y = MassperLiter/ParticlesPerLiter, shape = as.factor(Depth), fill = as.factor(Depth))) +
  facet_wrap(~Station, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Depth))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  labs(y = "Dry Mass (mg) / Particle", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = .5))
#ParticleMassPlot
x.grob <- textGrob(expression(paste("Particle Size (", mu, "m)")), 
                   gp=gpar(fontsize=16))
combinedPlot <- plot_grid(PPLPlot, ParticleMassPlot, abunPlot, nrow = 1, labels = c("A", "B", "C"))
meta2 <- grid.arrange(arrangeGrob(combinedPlot, bottom = x.grob), right = SairahLegend)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbml0aWFsIFN0dWZmCgpMb2FkIGluIEluaXRpYWwgUHJvY2Vzc2luZyBmaWxlIChhbmQgZGVwZW5kZW5jaWVzKQoKYGBge3J9CnNvdXJjZShoZXJlOjpoZXJlKCJSU2NyaXB0cyIsICJJbml0aWFsUHJvY2Vzc2luZ18zLlIiKSkKc291cmNlKGhlcmU6OmhlcmUoIlJMaWJyYXJpZXMiLCAiQ2hlc2FwZWFrZVBlcnNvbmFsTGlicmFyeS5SIikpCmBgYAoKCiMgQ2VsbHMvbWcgb2YgcGFydGljbGUKCmBgYHtyfQojIG15X3NpemVzIDwtIHNvcnQodW5pcXVlKG1pY3JvYmlhbEFidW5kYW5jZSRTaXplX0NsYXNzKSkKIyBteV9zaXplcwpgYGAKCmBgYHtyfQojIHNjaWVudGlmaWNfMTBfYyA8LSBmdW5jdGlvbih4KSB7CiMgICAgIHhvdXQgPC0gZ3N1YigiMWUiLCAiMTBeeyIsIGZvcm1hdCh4KSxmaXhlZD1UUlVFKQojICAgICB4b3V0IDwtIGdzdWIoInstMCIsICJ7LSIsIHhvdXQsZml4ZWQ9VFJVRSkKIyAgICAgeG91dCA8LSBnc3ViKCJ7KyIsICJ7IiwgeG91dCxmaXhlZD1UUlVFKQojICAgICB4b3V0IDwtIGdzdWIoInswIiwgInsiLCB4b3V0LGZpeGVkPVRSVUUpCiMgICAgIHhvdXQgPC0gcGFzdGUoeG91dCwifSIsc2VwPSIiKQojICAgICByZXR1cm4ocGFyc2UodGV4dD14b3V0KSkKIyAgICAgCiMgfQojIAojIHNjYWxlX3lfbG9nMTBuaWNlIDwtIGZ1bmN0aW9uKG5hbWU9TlVMTCxvbWFnPXNlcSgtMTAsMjApLC4uLikgewojICAgICBicmVha3MxMCA8LSAxMF5vbWFnCiMgICAgIHNjYWxlX3lfbG9nMTAoYnJlYWtzPWJyZWFrczEwLGxhYmVscz1zY2llbnRpZmljXzEwX2MoYnJlYWtzMTApLC4uLikKIyB9ICMgUmVjbG9jYXRlZCB0byBDaGVzYXBlYWtlUGVyc29uYWxMaWJyYXJ5LlIKYGBgCgoKYGBge3J9CmFidW5QbG90IDwtIG1pY3JvYmlhbEFidW5kYW5jZSAlPiUgCiAgZmlsdGVyKGlzLmZpbml0ZShNYXNzcGVyTGl0ZXIpKSAlPiUKICBmaWx0ZXIoRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpKSAlPiUKICBtdXRhdGUoY29waWVzUGVyTWcgPSBjb3BpZXNQZXJMIC8gTWFzc3BlckxpdGVyKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBTaXplX0NsYXNzLCB5ID0gY29waWVzUGVyTWcsIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pLCBmaWxsID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIGZhY2V0X3dyYXAofkRlcHRoLCBuY29sID0gMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogICNnZW9tX3BhdGgoKSArIAogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBsYWJzKHkgPSAiMTZzICsgMThzIEdlbmVzIC8gbWcgUGFydGljbGVzIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC41KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAibW0iKSwgdmp1c3QgPSAwKSkKYWJ1blBsb3QKYGBgCgpgYGB7cn0KUFBMUGxvdCA8LSBtaWNyb2JpYWxBYnVuZGFuY2UgJT4lCiAgZmlsdGVyKFNpemVfQ2xhc3MgPj0gMSkgJT4lCiAgZmlsdGVyKERlcHRoICVpbiUgYygiU3VyZmFjZSIsICJCb3R0b20iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gU2l6ZV9DbGFzcywgeSA9IFBhcnRpY2xlc1BlckxpdGVyLCBzaGFwZSA9IGFzLmZhY3RvcihTdGF0aW9uKSwgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBmYWNldF93cmFwKH5EZXB0aCwgbmNvbCA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICAjZ2VvbV9wYXRoKCkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnPXNlcSgtMTAsMjAsIGJ5ID0gMikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgbGFicyh5ID0gIlBhcnRpY2xlcy9ML21tIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC41KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAibW0iKSwgdmp1c3QgPSAwKSkKUFBMUGxvdApgYGAKCmBgYHtyfQpQYXJ0aWNsZU1hc3NQbG90IDwtIG1pY3JvYmlhbEFidW5kYW5jZSAlPiUKICBmaWx0ZXIoU2l6ZV9DbGFzcyA+PSAxKSAlPiUKICBmaWx0ZXIoRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBTaXplX0NsYXNzLCB5ID0gTWFzc3BlckxpdGVyL1BhcnRpY2xlc1BlckxpdGVyLCBzaGFwZSA9IGFzLmZhY3RvcihTdGF0aW9uKSwgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBmYWNldF93cmFwKH5EZXB0aCwgbmNvbCA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICAjZ2VvbV9wYXRoKCkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnID0gc2VxKC0xMCwgMjAsIGJ5ID0gMikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgbGFicyh5ID0gIkRyeSBNYXNzIChtZykgLyBQYXJ0aWNsZSIsIHggPSBleHByZXNzaW9uKHBhc3RlKCJQYXJ0aWNsZSBTaXplICgiLCBtdSwgIm0pIikpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAuNSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgIm1tIiksIHZqdXN0ID0gLjUpKQpQYXJ0aWNsZU1hc3NQbG90CmBgYAoKIyBJYmlkIGJ1dCBjb21iaW5lZCB3aXRoIGRhdGEgYWJvdXQgcGFydGljbGVzIGFuZCB0aGUgQ0IgbWFwCkkgbmVlZCB0byBsb2FkIG92ZXIgZGF0YSBmcm9tIHRoZSBDQi1CYXkgcHJvamVjdAoKYGBge3J9CnNvdXJjZShoZXJlKCJSU2NyaXB0cyIsICJDQk1hcC5SX1RyYW5zZWN0IikpCmBgYAoKYGBge3J9CmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKYGBgCgpgYGB7cn0KeC5ncm9iIDwtIHRleHRHcm9iKGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSksIAogICAgICAgICAgICAgICAgICAgZ3A9Z3Bhcihmb250c2l6ZT0xNikpCmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQgPSA0LCBmaWcud2lkdGggPSAxMX0KY29tYmluZWRQbG90IDwtIHBsb3RfZ3JpZChQUExQbG90LCBQYXJ0aWNsZU1hc3NQbG90LCBhYnVuUGxvdCwgbnJvdyA9IDEsIGxhYmVscyA9IGMoIkIiLCAiQyIsICJEIikpCmBgYAoKYGBge3J9Cm1ldGEyIDwtIGdyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihjb21iaW5lZFBsb3QsIGJvdHRvbSA9IHguZ3JvYikpCmBgYAoKYGBge3J9CmNiTWFwCmBgYAoKCmBgYHtyfQpwaHlzaWNhbF9wYXJ0aWNsZXMgPC0gcGxvdF9ncmlkKGNiTWFwLCBtZXRhMiwgcmVsX3dpZHRocyA9IGMoMSwzKSwgbGFiZWxzID0gYygiQSIsICIiKSkKcGh5c2ljYWxfcGFydGljbGVzCmBgYAoKYGBge3J9Cmdnc2F2ZSgiUGh5c2ljYWxQYXJ0aWNsZXMucG5nIiwgcGh5c2ljYWxfcGFydGljbGVzLCBoZWlnaHQgPSA0LCB3aWR0aCA9IDgpCmBgYAoKCgojIEV4YW1wbGFyIHNwZWNpZXMgcGxvdAoKV2hhdCBhcmUgdGhlIG1vc3QgYWJ1bmRhbnQgQVNWcyBmcm9tIGVhY2ggY2x1c3Rlcj8KUGxvdCB0aGVpciBhYnVuZGFuY2UuClBpY2sgdGhlIHByZXR0aWVzdCBmZXcgYW5kIHBsb3QKCmBgYHtyfQpzb3VyY2UoaGVyZTo6aGVyZSgiUlNjcmlwdHMiLCAiQ2x1c3RlcmluZ0NvcmUuUiIpKQpgYGAKCgpgYGB7cn0KaGdyb3Vwc19leGVtcGxhcnMgPC0gY3V0cmVlKHNjbHVzdCwgayA9IDEwKQpgYGAKCgpgYGB7cn0Kbm9uU3Bpa2VzMjBDIDwtIG5vblNwaWtlczIwICU+JSBsZWZ0X2pvaW4oCiAgdGliYmxlKEFTViA9IG5hbWVzKGhncm91cHNfZXhlbXBsYXJzKSwgY2x1c3RlciA9IGhncm91cHNfZXhlbXBsYXJzKSwgYnkgPSAiQVNWIikKQVNWc1RvVmlldyA8LSBub25TcGlrZXMyMEMgJT4lCiAgZmlsdGVyKEtpbmdkb20gPT0gIkJhY3RlcmlhIikgJT4lCiAgZ3JvdXBfYnkoQVNWLCBjbHVzdGVyKSAlPiUKICBzdW1tYXJpc2UobWVhbkNvcGllcyA9IG1lYW4oY29waWVzUGVyTCkpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQogIHN1bW1hcml6ZSh0b3BBU1YgPSBBU1Zbd2hpY2gubWF4KG1lYW5Db3BpZXMpXSkKICAKYGBgCgpgYGB7cn0KQVNWc1RvVmlldwpgYGAKCgoKYGBge3J9Cm5vblNwaWtlczIwQyAlPiUgCiAgcmlnaHRfam9pbihBU1ZzVG9WaWV3LCBieSA9IGMoIkFTViIgPSAidG9wQVNWIiwgImNsdXN0ZXIiKSkgJT4lCiAgZ3JvdXBfYnkoQVNWKSAlPiUKICBzbGljZV9oZWFkKCkKYGBgCgoKCgoKYGBge3IgZmlnLndpZHRoID0gMTB9Cm5vblNwaWtlczIwQyAlPiUKICByaWdodF9qb2luKEFTVnNUb1ZpZXcsIGJ5ID0gYygiQVNWIiA9ICJ0b3BBU1YiLCAiY2x1c3RlciIgPSAiY2x1c3RlciIpKSAlPiUKICBmaWx0ZXIoY2x1c3RlciA8PSA3LCBEZXB0aCAlaW4lIGMoIlN1cmZhY2UiLCAiQm90dG9tIiksICFpcy5uYShEZXB0aCkpICU+JQogIGFycmFuZ2UoU2l6ZV9DbGFzcykgJT4lCiAgZ2dwbG90KGFlcyh5ID0gY29waWVzUGVyTC9CaW5fU2l6ZSwgeCA9IFNpemVfQ2xhc3MsIGZpbGwgPSBhcy5mYWN0b3IoU3RhdGlvbiksIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKCkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZmFjZXRfZ3JpZChEZXB0aCB+IFRhZykgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpCmBgYApGaWcgWC4gQ29waWVzIHBlciBMCgpgYGB7ciBmaWcud2lkdGggPSAxMH0Kbm9uU3Bpa2VzMjBDICU+JQogIHJpZ2h0X2pvaW4oQVNWc1RvVmlldywgYnkgPSBjKCJBU1YiID0gInRvcEFTViIsICJjbHVzdGVyIiA9ICJjbHVzdGVyIikpICU+JQogIGZpbHRlcihjbHVzdGVyIDw9IDcsIERlcHRoICVpbiUgYygiU3VyZmFjZSIsICJCb3R0b20iKSwgIWlzLm5hKERlcHRoKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShNYXNzcGVyTGl0ZXIpKSAlPiUKICBhcnJhbmdlKFNpemVfQ2xhc3MpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvTWFzc3BlckxpdGVyLCB4ID0gU2l6ZV9DbGFzcywgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSwgc2hhcGUgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2UoKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBmYWNldF9ncmlkKERlcHRoIH4gVGFnKSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikKYGBgCkZpZyBYICsgMS4gQ29waWVzIHBlciBtZyBzdHVmZi4KSSBkb24ndCBsb3ZlIHRoZXNlIGV4YW1wbGVzIGJlY2F1c2UgdGhlcmUgaXMgYSBidW5jaCBvZiBzdGF0aW9uIHRvIHN0YXRpb24gYXJpYW5jZSwgYW5kIHlvdSBuZXZlciBzZWUgdGhpbmdzIHRoYXQgbGlrZSwgYWx3YXlzIHNob3cgdXAgYXQgbGFyZ2Ugc3RhdGlvbnMuCgpJIHdvbmRlciBpZiBJIGNhbiBmaW5kIHNvbWUgZ29vZCBleGFtcGxlcyBvZiBjb25zaXN0YW50bHkgbGFyZ2UgcGFydGljbGUgc3R1ZmYgb3Igc29tZXRoaW5nLgoKIyBXaGF0IGlmCkkgbG9vayBmb3IgdGhpbmdzIHRoYXQgaGF2ZSBoaWdoIHBvc2l0aXZlIHNsb3BlIGNvZWZmaWNpZW50cyBiZXR3ZWVuIHNpemUgYW5kIG5vcm1hbGl6ZWQgY29waWVzIHBlciBMLgpBbmQgc2VsZWN0IGZvciBoaWdoIG1lYW4gYWJ1bmRhbmNlIGFuZCBoaWdoIHNsb3BlLgpBbmQgdXNlIHNpdGUgYXMgYSByYW5kb20gZWZmZWN0PwpXb3VsZCBiZSBuaWNlIHRvIGhhdmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgaW50ZXJtZWRpYXRlbHkgaGlnaCB0aG91Z2guClNvbWUgc29ydCBvZiBwb2x5bm9taWFsIHJlZ3Jlc3Npb24/CgpgYGB7cn0KbmVzdDIwIDwtIG5vblNwaWtlczIwICU+JQogIHNlbGVjdChBU1YsIFN0YXRpb246UGFydGljbGVzUGVyTGl0ZXIsIGNvcGllc1BlckwpICU+JQogIG11dGF0ZShTdGF0aW9uID0gYXMuZmFjdG9yKFN0YXRpb24pKSAlPiUKICBncm91cF9ieShBU1YpICU+JQogIG5lc3QoKQpgYGAKCmBgYHtyfQpUZXN0U3ViIDwtIG5lc3QyMFtbMl1dW1sxXV0gJT4lIHVuZ3JvdXAoKQpUZXN0U3ViCmBgYAoKYGBge3J9CmxpYnJhcnkobG1lNCkKbGlicmFyeShicm9vbSkKbGlicmFyeShicm9vbS5taXhlZCkKYGBgCgpgYGB7cn0KbG0obG9nKGNvcGllc1BlckwvQmluX1NpemUpIH4gbG9nKFNpemVfQ2xhc3MpLCBkYXRhID0gVGVzdFN1YikgJT4lIHRpZHkoKQpgYGAKCmBgYHtyfQpsbWVyKGxvZyhjb3BpZXNQZXJML0Jpbl9TaXplKSB+IGxvZyhTaXplX0NsYXNzKSArIChTaXplX0NsYXNzfFN0YXRpb24pICsgKFNpemVfQ2xhc3N8RGVwdGgpICwgZGF0YSA9IFRlc3RTdWIgJT4lIAogICAgICAgbXV0YXRlKGFzLmZhY3RvcihTdGF0aW9uKSkpICU+JSBBSUMoKQoKbG1lcihsb2coY29waWVzUGVyTC9CaW5fU2l6ZSkgfiBsb2coU2l6ZV9DbGFzcykgKyAoMXxTdGF0aW9uKSArICgxfERlcHRoKSAsIGRhdGEgPSBUZXN0U3ViICU+JSAKICAgICAgIG11dGF0ZShhcy5mYWN0b3IoU3RhdGlvbikpKSAlPiUgQUlDKCkgIyBCZXR0ZXIKYGBgCgpgYGB7cn0KbW9kRGYgPC0gbmVzdDIwICU+JQogIG11dGF0ZShtb2QgPSBtYXAoZGF0YSwgCiAgICAgICAgICAgICAgICAgICB+bG1lcihsb2coKGNvcGllc1BlckwrMSkvQmluX1NpemUpIH4gbG9nKFNpemVfQ2xhc3MpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNpemVfQ2xhc3N8U3RhdGlvbikgKyAoU2l6ZV9DbGFzc3xEZXB0aCksIGRhdGEgPSAuKQogICkKICApCmBgYAoKYGBge3J9Cm1vZERmMDEgPC0gbW9kRGYgJT4lIAogIG11dGF0ZSh0aWRpZWQgPSBtYXAobW9kLCB0aWR5KSkgJT4lCiAgdW5uZXN0KHRpZGllZCkgJT4lCiAgc2VsZWN0KC1kYXRhLCAtbW9kKQpgYGAKCmBgYHtyfQptb2REZjAyIDwtIG1vZERmMDEgJT4lCiAgZmlsdGVyKHRlcm0gPT0gImxvZyhTaXplX0NsYXNzKSIpICU+JQogIHNlbGVjdChBU1YsIGVzdGltYXRlLCBzdGQuZXJyb3IpCmBgYAoKYGBge3J9Cm1vZERmMDIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZXN0aW1hdGUpKSArIGdlb21faGlzdG9ncmFtKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IC00LCB0byA9IDIsIGJ5ID0gMSkpCmBgYApUaGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgb3JlIGFidW5kYW50IGluIHRoZSBsYXJnZSBwYXJ0aWNsZXMKClNvIE1hbnkgQVNWcy4gSG93IGRvIEkgSUQgdGhlIG9uZXMgSSB3YW50PwoKSSBraW5kIG9mIHdhbnQgdG8gbG9vayBhdCBhdmVyYWdlIGNvbmNlbnRyYXRpb25zIChvciBzdW1zKQoKYGBge3J9ClNsb3Blc0FuZE1lYW5zIDwtIG5vblNwaWtlczIwICU+JQogICNmaWx0ZXIoS2luZ2RvbSA9PSAiQmFjdGVyaWEiKSAlPiUKICBncm91cF9ieShBU1YpICU+JQogIHN1bW1hcmlzZShtZWFuQ29waWVzID0gbWVhbihjb3BpZXNQZXJMKSkgJT4lCiAgbGVmdF9qb2luKG1vZERmMDIsIGJ5ID0gIkFTViIpClNsb3Blc0FuZE1lYW5zICU+JSBoZWFkKCkKYGBgCgpgYGB7cn0KU2xvcGVzQW5kTWVhbnMgJT4lCiAgZmlsdGVyKGVzdGltYXRlID49IDApICU+JQogIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gbWVhbkNvcGllcywgbGFiZWwgPSBBU1YpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xhYmVsX3JlcGVsKCkKYGBgCkFTViAxMyBsb29rcyBwcm9taXNpbmcKCmBgYHtyfQp0YXhhICU+JSAKICBmaWx0ZXIoQVNWICVpbiUgYygiQVNWXzEzIiwgIkFTVl8yMyIsICJBU1ZfNTgiKSkKYGBgCgpUaGUgYmlnIHN0dWZmIGFyZSBhbGwgY3lhbm9zISBIdWguCgpgYGB7cn0KVGFyZ2V0cyA8LSBTbG9wZXNBbmRNZWFucyAlPiUgZmlsdGVyKGVzdGltYXRlID4gMCwgbWVhbkNvcGllcyA+IDFlNSkgJT4lIHB1bGwoQVNWKQp0YXhhICU+JQogIGZpbHRlcihBU1YgJWluJSBUYXJnZXRzKQpgYGAKCmBgYHtyfQpIb3JzZXMgPC0gU2xvcGVzQW5kTWVhbnMgJT4lIAogIGxlZnRfam9pbih0YXhhLCBieSA9ICJBU1YiKSAlPiUKICBmaWx0ZXIoZXN0aW1hdGUgPiAwLCBtZWFuQ29waWVzID4gMGU1KSAlPiUKICBhcnJhbmdlKC1tZWFuQ29waWVzKQpIb3JzZXMKYGBgCgpPay4gQmlnIHN0dWZmIGFyZSBjeWFub3MgYW5kIFBsYW5jdG9teWNldGVzLCBhbmQgYXBwYXJlbnRseSBTcGlkZXJzLgpBbHNvIGFwcGFyZW50bHkgc29tZSBwcm90ZW9zIG9mIGRpZmZlcmVudCBzdHJpcGVzLiBSaG9kb2JhY3RlciBhcmUgY29vbCB0aG91Z2guCgpgYGB7ciBmaWcud2lkdGggPSAxMH0Kbm9uU3Bpa2VzMjAgJT4lCiAgbGVmdF9qb2luKFNsb3Blc0FuZE1lYW5zLCBieSA9ICJBU1YiKSAlPiUKICBmaWx0ZXIoZXN0aW1hdGUgPiAwLCBtZWFuQ29waWVzID4gMWU1LCBEZXB0aCAhPSAiT3h5IikgJT4lCiAgYXJyYW5nZSgtbWVhbkNvcGllcywgU2l6ZV9DbGFzcykgJT4lCiAgZ2dwbG90KGFlcyh5ID0gY29waWVzUGVyTC9CaW5fU2l6ZSwgeCA9IFNpemVfQ2xhc3MsIGZpbGwgPSBhcy5mYWN0b3IoU3RhdGlvbiksIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKCkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZmFjZXRfZ3JpZChEZXB0aCB+IFRhZykgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKYGBgCgpgYGB7ciBmaWcud2lkdGggPSAxMH0Kbm9uU3Bpa2VzMjAgJT4lCiAgbGVmdF9qb2luKFNsb3Blc0FuZE1lYW5zLCBieSA9ICJBU1YiKSAlPiUKICBmaWx0ZXIoZXN0aW1hdGUgPiAwLCBtZWFuQ29waWVzID4gMWU1LCBEZXB0aCAhPSAiT3h5IikgJT4lCiAgYXJyYW5nZSgtbWVhbkNvcGllcywgU2l6ZV9DbGFzcykgJT4lCiAgZmlsdGVyKEFTViA9PSAiQVNWXzciKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcywgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSwgc2hhcGUgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2UoKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICAjZmFjZXRfZ3JpZChEZXB0aCB+IFRhZykgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKYGBgCgpgYGB7ciBmaWcud2lkdGggPSAxMH0Kbm9uU3Bpa2VzMjAgJT4lCiAgbGVmdF9qb2luKFNsb3Blc0FuZE1lYW5zLCBieSA9ICJBU1YiKSAlPiUKICBmaWx0ZXIoZXN0aW1hdGUgPiAwLCBtZWFuQ29waWVzIDwgMWU1LCBEZXB0aCAhPSAiT3h5IikgJT4lCiAgYXJyYW5nZSgtbWVhbkNvcGllcywgU2l6ZV9DbGFzcykgJT4lCiAgZ2dwbG90KGFlcyh5ID0gY29waWVzUGVyTC9CaW5fU2l6ZSwgeCA9IFNpemVfQ2xhc3MsIGZpbGwgPSBhcy5mYWN0b3IoU3RhdGlvbiksIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKCkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZmFjZXRfZ3JpZChEZXB0aCB+IFRhZykgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKYGBgCgpMZXRzIGxvb2sgYXQgdGhlc2UhCgpJIGxpa2UsIGFzIGV4YW1wbGVzIFBhcmFjb2NjdXMgKGEgUmhvZG9iYWN0ZXIpIC1BU1ZfNDU5ClN5bmVjaG9jb2NjdXNfQ0M5OTAyIC0tIEFTVl8yMwpTQVIxMV9DbGFkZSAtLSBBU1ZfMwoKYGBge3J9Cm5vblNwaWtlczIwICU+JQogIGZpbHRlcihBU1YgJWluJSBjKCJBU1ZfMyIsICJBU1ZfMjMiLCAiQVNWXzQ1OSIpLCBEZXB0aCAhPSAiT3h5IikgJT4lCiAgYXJyYW5nZShTaXplX0NsYXNzKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcywgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSwgc2hhcGUgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2Uob21hZyA9IHNlcSgtMTAsIDIwLCBieSA9IDIpKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBmYWNldF9ncmlkKERlcHRoIH4gVGFnKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnMoeSA9ICIxNnMgQ29waWVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSwgZmlsbCA9ICJTdGF0aW9uIiwgY29sb3IgPSAiU3RhdGlvbiIsIHNoYXBlID0gIlN0YXRpb24iKQpgYGAKCgoKIyBNb2R1bGUgYWJ1bmRhbmNlIHBsb3QKCmBgYHtyfQpoZ3JvdXBzX2FudHMgPC0gY3V0cmVlKHNjbHVzdCwgayA9IDUwKQpgYGAKCgpgYGB7cn0Kbm9uU3Bpa2VzMjBBIDwtIG5vblNwaWtlczIwICU+JSBsZWZ0X2pvaW4oCiAgdGliYmxlKEFTViA9IG5hbWVzKGhncm91cHNfYW50cyksIGNsdXN0ZXIgPSBoZ3JvdXBzX2FudHMpLCBieSA9ICJBU1YiKQojIEFTVnNUb1ZpZXcgPC0gbm9uU3Bpa2VzMjBBICU+JQojICAgZmlsdGVyKEtpbmdkb20gPT0gIkJhY3RlcmlhIikgJT4lCiMgICBncm91cF9ieShBU1YsIGNsdXN0ZXIpICU+JQojICAgc3VtbWFyaXNlKG1lYW5Db3BpZXMgPSBtZWFuKGNvcGllc1BlckwpKSAlPiUKIyAgIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQojICAgc3VtbWFyaXplKHRvcEFTViA9IEFTVlt3aGljaC5tYXgobWVhbkNvcGllcyldKQogIApgYGAKCmBgYHtyfQpDbHVzdGVyU3Vtc0EgPC0gbm9uU3Bpa2VzMjBBICU+JQogIGdyb3VwX2J5KFN0YXRpb24sIERlcHRoLCBjbHVzdGVyLCBTaXplX0NsYXNzLCBCaW5fU2l6ZSkgJT4lCiAgc3VtbWFyaXNlKGNvcGllc1BlckwgPSBzdW0oY29waWVzUGVyTCkpCmBgYAoKCmBgYHtyfQpIdWdlU3VyZmFjZVBsb3QgPC0gbm9uU3Bpa2VzMjBBICU+JQogIGZpbHRlcihEZXB0aCA9PSAiU3VyZmFjZSIpICU+JQogIGFycmFuZ2UoQmluX1NpemUpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvQmluX1NpemUsIHggPSBTaXplX0NsYXNzKSkgKwogIGZhY2V0X2dyaWQoY2x1c3RlciB+IFN0YXRpb24pICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnID0gc2VxKC0xMCwgMjAsIGJ5ID0gNCkpICsgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIGdlb21fcGF0aChhbHBoYSA9IDAuNSwgYWVzKGdyb3VwID0gQVNWKSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnMoeSA9ICIxNnMgQ29waWVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSwgZmlsbCA9ICJTdGF0aW9uIiwgY29sb3IgPSAiU3RhdGlvbiIsIHNoYXBlID0gIlN0YXRpb24iKSArCiAgZ2VvbV9wYXRoKGNvbG9yID0gInJlZCIsIGRhdGEgPSBDbHVzdGVyU3Vtc0EgJT4lIGZpbHRlcihEZXB0aCA9PSAiU3VyZmFjZSIpKSAjIEFkZCBzdW1zCmdnc2F2ZSgiSHVnZVN1cmZhY2VQbG90LnBkZiIsIEh1Z2VTdXJmYWNlUGxvdCwgaGVpZ2h0ID0gNzIsIHdpZHRoID0gOCwgbGltaXRzaXplID0gRkFMU0UpCmBgYAoKSSB0aGluayB3ZSdyZSB1c2luZyAiaW50ZXJjZXB0IiBpbiB0aGUgY2x1c3RlcmluZyBpbmZvcm1hdGlvbiBzb21laG93LiBXaGljaCBJIGRvbid0IHBhcnRpY3VsYXJseSB3YW50LiBCdXQgdGhlIGNsdXN0ZXJpbmcgZG9lcyBoYXBwZW4gYnkgY29ycmVsYXRpb24uIFN1cGVyIHN0cmFuZ2UuIE1heWJlIHRoZSBjb3JyZWxhdGlvbiBpc24ndCB0aGUgd2F5IEkgdGhpbmsgaXQgaXM/CgpgYGB7cn0KTWluaW1hbFN1cmZhY2VQbG90IDwtIG5vblNwaWtlczIwQSAlPiUKICBmaWx0ZXIoRGVwdGggPT0gIlN1cmZhY2UiLCBjbHVzdGVyICVpbiUgYygxLCA3LCAxNSkpICU+JQogIGFycmFuZ2UoQmluX1NpemUpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvQmluX1NpemUsIHggPSBTaXplX0NsYXNzKSkgKwogIGZhY2V0X2dyaWQoY2x1c3Rlcn4gU3RhdGlvbikgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWcgPSBzZXEoLTEwLCAyMCwgYnkgPSAyKSkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZ2VvbV9wYXRoKGFscGhhID0gMC41LCBhZXMoZ3JvdXAgPSBBU1YpKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh5ID0gIjE2cyBDb3BpZXMvTC9tbSIsIHggPSBleHByZXNzaW9uKHBhc3RlKCJQYXJ0aWNsZSBTaXplICgiLCBtdSwgIm0pIikpLCBmaWxsID0gIlN0YXRpb24iLCBjb2xvciA9ICJTdGF0aW9uIiwgc2hhcGUgPSAiU3RhdGlvbiIpICsKICBnZW9tX3BhdGgoY29sb3IgPSAicmVkIiwgZGF0YSA9IENsdXN0ZXJTdW1zQSAlPiUgZmlsdGVyKERlcHRoID09ICJTdXJmYWNlIiwgY2x1c3RlciAlaW4lIGMoMSwgNywgMTUpKSkgIyBBZGQgc3VtcwpnZ3NhdmUoIk1pbmltYWxTdXJmYWNlUGxvdC5wZGYiLCBNaW5pbWFsU3VyZmFjZVBsb3QsIGhlaWdodCA9IDExLCB3aWR0aCA9IDgsIGxpbWl0c2l6ZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpNaW5pbWFsU3VyZmFjZVBsb3QKYGBgCgoKYGBge3J9Ck1pbmltYWxDbHVzdGVyUGxvdCA8LSBub25TcGlrZXMyMEEgJT4lCiAgZmlsdGVyKERlcHRoICE9ICJPeHkiLCBjbHVzdGVyICVpbiUgYygxLCA3LCAxNSkpICU+JQogIGFycmFuZ2UoQmluX1NpemUpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvQmluX1NpemUsIHggPSBTaXplX0NsYXNzKSkgKwogIGZhY2V0X2dyaWQoY2x1c3RlciArIERlcHRoIH4gU3RhdGlvbikgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWcgPSBzZXEoLTEwLCAyMCwgYnkgPSAyKSkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZ2VvbV9wYXRoKGFscGhhID0gMC41LCBhZXMoZ3JvdXAgPSBBU1YpKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh5ID0gIjE2cyBDb3BpZXMvTC9tbSIsIHggPSBleHByZXNzaW9uKHBhc3RlKCJQYXJ0aWNsZSBTaXplICgiLCBtdSwgIm0pIikpLCBmaWxsID0gIlN0YXRpb24iLCBjb2xvciA9ICJTdGF0aW9uIiwgc2hhcGUgPSAiU3RhdGlvbiIpICsKICBnZW9tX3BhdGgoY29sb3IgPSAicmVkIiwgZGF0YSA9IENsdXN0ZXJTdW1zQSAlPiUgZmlsdGVyKERlcHRoICE9ICJPeHkiLCBjbHVzdGVyICVpbiUgYygxLCA3LCAxNSkpKSAjIEFkZCBzdW1zCmdnc2F2ZSgiTWluaW1hbENsdXN0ZXJQbG90LnBkZiIsIE1pbmltYWxDbHVzdGVyUGxvdCwgaGVpZ2h0ID0gMTEsIHdpZHRoID0gOCwgbGltaXRzaXplID0gRkFMU0UpCmBgYAoKCiMgRm9yIHNhaXJhaCBzcGVjaWZpY2FsbHkKCmBgYHtyfQpFeGFtcGxlVGF4YSA8LSBub25TcGlrZXMyMCAlPiUKICBmaWx0ZXIoQVNWICVpbiUgYygiQVNWXzMiLCAiQVNWXzIzIiwgIkFTVl80NTkiKSkgJT4lCiAgZmlsdGVyKFN0YXRpb24gJWluJSBjKCIzLjMiLCAiNC4zIikpICU+JQogIG11dGF0ZShEZXB0aCA9IHJlY29kZShEZXB0aCwgT3h5ID0gIk94eWNsaW5lIikpICU+JQogIGFycmFuZ2UoU2l6ZV9DbGFzcykgJT4lCiAgZ2dwbG90KGFlcyh5ID0gY29waWVzUGVyTC9CaW5fU2l6ZSwgeCA9IFNpemVfQ2xhc3MsIGZpbGwgPSBhcy5mYWN0b3IoRGVwdGgpLCBzaGFwZSA9IGFzLmZhY3RvcihEZXB0aCkpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2Uob21hZyA9IHNlcSgtMTAsIDIwLCBieSA9IDIpKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBmYWNldF9ncmlkKFN0YXRpb24gfiBUYWcpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IGFzLmZhY3RvcihEZXB0aCkpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJibHVlIiwgImJsYWNrIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIpKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKwogIGxhYnMoeSA9ICIxNnMgQ29waWVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSwgZmlsbCA9ICJTdGF0aW9uIiwgY29sb3IgPSAiU3RhdGlvbiIsIHNoYXBlID0gIlN0YXRpb24iKQpFeGFtcGxlVGF4YQpgYGAKCiMjIyBUaGluZyAyCgoKYGBge3J9CmFidW5QbG90MCA8LSBtaWNyb2JpYWxBYnVuZGFuY2UgJT4lIAogIGZpbHRlcihpcy5maW5pdGUoTWFzc3BlckxpdGVyKSkgJT4lCiAgI2ZpbHRlcihEZXB0aCAlaW4lIGMoIlN1cmZhY2UiLCAiQm90dG9tIikpICU+JQogIGZpbHRlcihTdGF0aW9uICVpbiUgYygzLjMsIDQuMykpICU+JQogIG11dGF0ZShEZXB0aCA9IHJlY29kZShEZXB0aCwgT3h5ID0gIk94eWNsaW5lIikpICU+JQogIG11dGF0ZShjb3BpZXNQZXJNZyA9IGNvcGllc1BlckwgLyBNYXNzcGVyTGl0ZXIpICU+JQogIGdncGxvdChhZXMoeCA9IFNpemVfQ2xhc3MsIHkgPSBjb3BpZXNQZXJNZywgc2hhcGUgPSBhcy5mYWN0b3IoRGVwdGgpLCBmaWxsID0gYXMuZmFjdG9yKERlcHRoKSkpICsKICBmYWNldF93cmFwKH5TdGF0aW9uLCBuY29sID0gMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogICNnZW9tX3BhdGgoKSArIAogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoRGVwdGgpKSkgKwogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBzY2FsZV95X2xvZzEwbmljZSgpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJibHVlIiwgImJsYWNrIikpICsKICBsYWJzKHkgPSAiMTZzICsgMThzIEdlbmVzIC8gbWcgUGFydGljbGVzIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSksIGNvbG9yID0gIkRlcHRoIiwgZmlsbCA9ICJEZXB0aCIsIHNoYXBlID0gIkRlcHRoIikgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAuNSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgIm1tIiksIHZqdXN0ID0gMCkpClNhaXJhaExlZ2VuZCA8LSBnZXRfbGVnZW5kKGFidW5QbG90MCkKYWJ1blBsb3QgPC0gYWJ1blBsb3QwICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQojYWJ1blBsb3QKYGBgCgpgYGB7cn0KUFBMUGxvdCA8LSBtaWNyb2JpYWxBYnVuZGFuY2UgJT4lCiAgZmlsdGVyKFNpemVfQ2xhc3MgPj0gMSkgJT4lCiAgI2ZpbHRlcihEZXB0aCAlaW4lIGMoIlN1cmZhY2UiLCAiQm90dG9tIikpICU+JQogIGZpbHRlcihTdGF0aW9uICVpbiUgYygzLjMsIDQuMykpICU+JQogIGdncGxvdChhZXMoeCA9IFNpemVfQ2xhc3MsIHkgPSBQYXJ0aWNsZXNQZXJMaXRlciwgc2hhcGUgPSBhcy5mYWN0b3IoRGVwdGgpLCBmaWxsID0gYXMuZmFjdG9yKERlcHRoKSkpICsKICBmYWNldF93cmFwKH5TdGF0aW9uLCBuY29sID0gMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogICNnZW9tX3BhdGgoKSArIAogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoRGVwdGgpKSkgKwogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnPXNlcSgtMTAsMjAsIGJ5ID0gMikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJibHVlIiwgImJsYWNrIikpICsKICBsYWJzKHkgPSAiUGFydGljbGVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLjUpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJtbSIpLCB2anVzdCA9IDApKQojUFBMUGxvdAoKCmBgYAoKYGBge3J9ClBhcnRpY2xlTWFzc1Bsb3QgPC0gbWljcm9iaWFsQWJ1bmRhbmNlICU+JQogIGZpbHRlcihTaXplX0NsYXNzID49IDEpICU+JQogICNmaWx0ZXIoRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpKSAlPiUKICBmaWx0ZXIoU3RhdGlvbiAlaW4lIGMoMy4zLCA0LjMpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBTaXplX0NsYXNzLCB5ID0gTWFzc3BlckxpdGVyL1BhcnRpY2xlc1BlckxpdGVyLCBzaGFwZSA9IGFzLmZhY3RvcihEZXB0aCksIGZpbGwgPSBhcy5mYWN0b3IoRGVwdGgpKSkgKwogIGZhY2V0X3dyYXAoflN0YXRpb24sIG5jb2wgPSAxKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgI2dlb21fcGF0aCgpICsgCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IGFzLmZhY3RvcihEZXB0aCkpKSArCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWcgPSBzZXEoLTEwLCAyMCwgYnkgPSAyKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siKSkgKwogIGxhYnMoeSA9ICJEcnkgTWFzcyAobWcpIC8gUGFydGljbGUiLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLjUpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJtbSIpLCB2anVzdCA9IC41KSkKI1BhcnRpY2xlTWFzc1Bsb3QKYGBgCgpgYGB7cn0KeC5ncm9iIDwtIHRleHRHcm9iKGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSksIAogICAgICAgICAgICAgICAgICAgZ3A9Z3Bhcihmb250c2l6ZT0xNikpCmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQgPSA0LCBmaWcud2lkdGggPSAxMX0KY29tYmluZWRQbG90IDwtIHBsb3RfZ3JpZChQUExQbG90LCBQYXJ0aWNsZU1hc3NQbG90LCBhYnVuUGxvdCwgbnJvdyA9IDEsIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIikpCmBgYAoKYGBge3J9Cm1ldGEyIDwtIGdyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihjb21iaW5lZFBsb3QsIGJvdHRvbSA9IHguZ3JvYiksIHJpZ2h0ID0gU2FpcmFoTGVnZW5kKQpgYGA=